package com.dlc.shop.dao;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dlc.shop.bean.dto.flow.MemberReqDTO;
import com.dlc.shop.bean.model.User;
import com.dlc.shop.bean.model.UserLevelLang;
import com.dlc.shop.bean.param.*;
import com.dlc.shop.bean.vo.flow.MemberContributeValueVO;
import com.dlc.shop.bean.vo.flow.MemberOverviewVO;
import com.dlc.shop.common.util.PageAdapter;
import com.dlc.shop.common.util.PageParam;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * @author yami
 */
public interface UserMapper extends BaseMapper<User> {

    /**
     * 批量給对应等级的用户降低一个等级
     *
     * @param level     等级
     * @param levelType 会员类型
     */
    void setUserLevelBylevelId(@Param("level") Integer level, @Param("levelType") Integer levelType);

    /**
     * 获取截至日期之前的所有付费会员信息
     *
     * @param endOfDay 截至日期
     * @return
     */
    List<User> selectMemberByEndTime(@Param("endOfDay") DateTime endOfDay);

    /**
     * 根据等级，设置用户用等级
     *
     * @param level         等级
     * @param minNeedGrowth 最小需要的成长值
     * @param maxNeedGrowth 最大需要的成长值
     * @param levelType     会员类型
     */
    void setMaxUserLevelBylevelId(@Param("level") Integer level, @Param("minNeedGrowth") Integer minNeedGrowth, @Param("maxNeedGrowth") Integer maxNeedGrowth, @Param("levelType") Integer levelType);

    /**
     * 修改用户等级
     *
     * @param userList 需要更新的用户列表
     */
    void updateBatchById(@Param("userList") List<User> userList);

    /**
     * 获取用户详情
     *
     * @param userId 用户id
     * @return 用户
     */
    User getUserDetail(@Param("userId") String userId);

    /**
     * 条件按查询，分页获取用户列表
     *
     * @param page 分页参数
     * @param user 查询条件
     * @return 分页用户列表
     */
    IPage<User> getUserPage(PageParam<User> page, @Param("user") User user);

    /**
     * 获取用户id和用户注册时间
     *
     * @param userSet 用户列表
     * @return 用户列表
     */
    List<User> getUserListByUserNumbers(@Param("userSet") Set<String> userSet);

    /**
     * 根据参数，统计用户数量
     *
     * @param param 参数
     * @return 数量
     */
    Integer countUserByParam(@Param("param") CustomerReqParam param);

    /**
     * 根据参数，统计会员数量
     *
     * @param param 条件参数
     * @return 数量
     */
    Integer countMemberByParam(@Param("param") CustomerReqParam param);

    /**
     * 条件查询，分页获取会员信息列表
     *
     * @param adapter 分页参数
     * @param param   条件查询参数
     * @return 会员信息列表
     */
    List<UserManagerParam> getUserPageByParam(@Param("adapter") PageAdapter adapter,
                                              @Param("param") UserManagerReqParam param,
                                              @Param("paySysType") Integer paySysType);

    /**
     * 根据参数，统计查询到的会员总数
     *
     * @param adapter 分页参数
     * @param param   条件查询参数
     * @return 数量
     */
    Integer countGetUserPageByParam(@Param("adapter") PageAdapter adapter, @Param("param") UserManagerReqParam param);

    /**
     * 品牌/门店端分页查询客户列表
     *
     * @param page
     * @param reqParam
     * @return
     */
    IPage<CustomerManagerParam> pageCustomerByMultiShop(PageParam<CustomerManagerParam> page, @Param("reqParam") CustomerManagerParam reqParam);

    /**
     * 获取单个用户详情
     *
     * @param userId 用户id
     * @param paySysType 支付系统类型
     * @return 用户信息
     */
    UserManagerParam getuserInfo(@Param("userId") String userId,
                                 @Param("paySysType") Integer paySysType);

    /**
     * 根据多个手机号获取对应的用户
     *
     * @param phones 手机号集合
     * @return 用户列表
     */
    List<User> listByUserPhones(@Param("phones") List<String> phones);

    /**
     * 根据多个邮箱获取对应的用户
     *
     * @param mails 邮箱集合
     * @return 用户列表
     */
    List<User> listByUserMails(@Param("mails") List<String> mails);

    /**
     * 根据用户名查询用户信息(区分用户名大小写)
     *
     * @param userName
     * @return
     */
    User selectOneByUserName(@Param("userName") String userName);

    /**
     * 根据时间统计数据
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param levelType 等级
     * @return
     */
    List<CustomerPayParam> countUserByMemberParam(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("levelType") Integer levelType);

    /**
     * 获取新会员订单相关数据
     *
     * @param param
     * @param paySettlementType
     * @return
     */
    MemberOverviewVO getMemberAnalysisByParam(@Param("param") MemberReqDTO param, @Param("paySysType") Integer paySettlementType);

    /**
     * 获取会员趋势相关数据
     *
     * @param param
     * @return
     */
    Integer getMemberTrend(@Param("param") MemberReqDTO param);

    /**
     * 获取会员贡献值
     *
     * @param param
     * @param userLevelType
     * @param paySysType
     * @return
     */
    MemberContributeValueVO getMemberContributeValue(@Param("param") MemberReqDTO param, @Param("userLevelType") Integer userLevelType, @Param("paySysType") Integer paySysType);

    /**
     * 获取所有用户id
     *
     * @return
     */
    List<String> getUserIdList();

    /**
     * 根据userIds获取用户列表
     *
     * @param ids
     * @return
     */
    List<User> getUserByUserIds(@Param("ids") List<String> ids);

    /**
     * 店铺获取客户其他信息
     *
     * @param userIds
     * @param shopId
     * @return
     */
    List<CustomerManagerParam> listCustomerOtherDataByMultiShop(@Param("userIds") List<String> userIds, @Param("shopId") Long shopId);

    /**
     * 根据等级idList获取用户等级
     *
     * @param levelIdList 等级idList
     * @return
     */
    List<UserLevelLang> getUserLevelById(@Param("levelIdList") List<Long> levelIdList);

    /**
     * 分页查询店铺会员列表
     *
     * @param page     分页参数
     * @param reqParam 查询参数
     * @param lang     语言
     * @return
     */
    IPage<UserManagerParam> pageUserByMultiShop(PageParam<UserManagerParam> page,
                                                @Param("reqParam") UserManagerReqParam reqParam,
                                                @Param("lang") Integer lang);

    /**
     * 获取店铺会员的其他信息
     *
     * @param userIds 用户id集合
     * @param shopId  品牌id
     * @return 会员其他信息列表
     */
    List<UserManagerParam> listUserOtherDataByMultiShop(@Param("userIds") List<String> userIds,
                                                        @Param("shopId") Long shopId);

    /**
     * 根据用户手机号和昵称获取用户
     *
     * @param userMobile
     * @param nickName
     * @return
     */
    String getUserByUserMobileAndNickName(@Param("userMobile") String userMobile, @Param("nickName") String nickName);

    /**
     * 根据注册时间范围和成为付费会员时间范围查询用户id
     * @param registerMinTime
     * @param registerMaxTime
     * @param toBeMemberMinTime
     * @param toBeMemberMaxTime
     * @return
     */
    List<String> queryUserIdListByRegiestTimeAndVipTime(@Param("registerMinTime") LocalDateTime registerMinTime,
                                                        @Param("registerMaxTime") LocalDateTime registerMaxTime,
                                                        @Param("toBeMemberMinTime") LocalDateTime toBeMemberMinTime,
                                                        @Param("toBeMemberMaxTime") LocalDateTime toBeMemberMaxTime,
                                                        @Param("shopId") Long shopId);
}
